home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / plnk081.zip / pilot-link.0.8.1 / libsock / mail.c < prev    next >
C/C++ Source or Header  |  1997-08-08  |  10KB  |  450 lines

  1. /* mail.c:  Translate Pilot mail data formats
  2.  *
  3.  * Copyright (c) 1997, Kenneth Albanowski
  4.  *
  5.  * This is free software, licensed under the GNU Public License V2.
  6.  * See the file COPYING for details.
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include "pi-source.h"
  13. #include "pi-socket.h"
  14. #include "pi-dlp.h"
  15. #include "pi-mail.h"
  16.  
  17. char * MailSortTypeNames[] = { "Date", "Type", NULL };
  18. char * MailSyncTypeNames[] = { "All", "Send", "Filter", NULL };
  19.  
  20. void free_Mail(struct Mail * a) {
  21.   if (a->from)
  22.     free(a->from);
  23.   if (a->to)
  24.     free(a->to);
  25.   if (a->subject)
  26.     free(a->subject);
  27.   if (a->cc)
  28.     free(a->cc);
  29.   if (a->bcc)
  30.     free(a->bcc);
  31.   if (a->replyTo)
  32.     free(a->replyTo);
  33.   if (a->sentTo)
  34.     free(a->sentTo);
  35.   if (a->body)
  36.     free(a->body);
  37. }
  38.  
  39. void free_MailAppInfo(struct MailAppInfo * a) {
  40.   /*if (a->signature)
  41.     free(a->signature);*/
  42. }
  43.  
  44. void free_MailSyncPref(struct MailSyncPref * a) {
  45.   if (a->filterTo);
  46.     free(a->filterTo);
  47.   if (a->filterFrom);
  48.     free(a->filterFrom);
  49.   if (a->filterSubject);
  50.     free(a->filterSubject);
  51. }
  52.  
  53. void free_MailSignaturePref(struct MailSignaturePref * a) {
  54.   if (a->signature);
  55.     free(a->signature);
  56. }
  57.  
  58. int unpack_Mail(struct Mail * a, unsigned char * buffer, int len)
  59. {
  60.   unsigned long d;
  61.   int flags;
  62.   unsigned char * start = buffer;
  63.   
  64.   if (len < 6)
  65.     return 0;
  66.  
  67.   d = (unsigned short int)get_short(buffer);
  68.   a->date.tm_year = (d >> 9) + 4;
  69.   a->date.tm_mon = ((d >> 5) & 15) - 1;
  70.   a->date.tm_mday = d & 31;
  71.   a->date.tm_hour = get_byte(buffer+2);
  72.   a->date.tm_min = get_byte(buffer+3);
  73.   a->date.tm_sec = 0;
  74.   a->date.tm_isdst = -1;
  75.   mktime(&a->date);
  76.   
  77.   if (d)
  78.     a->dated = 1;
  79.   else
  80.     a->dated = 0;
  81.   
  82.   flags = get_byte(buffer+4);
  83.   
  84.   a->read = (flags & (1 << 7)) ? 1 : 0;
  85.   a->signature = (flags & (1 << 6)) ? 1 : 0;
  86.   a->confirmRead = (flags & (1 << 5)) ? 1 : 0;
  87.   a->confirmDelivery = (flags & (1 << 4)) ? 1 : 0;
  88.   a->priority = (flags & (3 << 2)) >> 2;
  89.   a->addressing = (flags & 3);
  90.   
  91.   buffer += 6;
  92.   len -= 6;
  93.   
  94.   if (len<1)
  95.     return 0;
  96.   if (get_byte(buffer)) {
  97.     a->subject = strdup(buffer);
  98.     buffer += strlen(buffer);
  99.     len -= strlen(buffer);
  100.   } else
  101.     a->subject = 0;
  102.   buffer++;
  103.   len--;
  104.   if (len<1)
  105.     return 0;
  106.   if (get_byte(buffer)) {
  107.     a->from = strdup(buffer);
  108.     buffer += strlen(buffer);
  109.     len -= strlen(buffer);
  110.   } else
  111.     a->from = 0;
  112.   buffer++;
  113.   len--;
  114.   if (len<1)
  115.     return 0;
  116.   if (get_byte(buffer)) {
  117.     a->to = strdup(buffer);
  118.     buffer += strlen(buffer);
  119.     len -= strlen(buffer);
  120.   } else
  121.     a->to = 0;
  122.   buffer++;
  123.   len--;
  124.   if (len<1)
  125.     return 0;
  126.   if (get_byte(buffer)) {
  127.     a->cc = strdup(buffer);
  128.     buffer += strlen(buffer);
  129.     len -= strlen(buffer);
  130.   } else
  131.     a->cc = 0;
  132.   buffer++;
  133.   len--;
  134.   if (len<1)
  135.     return 0;
  136.   if (get_byte(buffer)) {
  137.     a->bcc = strdup(buffer);
  138.     buffer += strlen(buffer);
  139.     len -= strlen(buffer);
  140.   } else
  141.     a->bcc = 0;
  142.   buffer++;
  143.   len--;
  144.   if (len<1)
  145.     return 0;
  146.   if (get_byte(buffer)) {
  147.     a->replyTo = strdup(buffer);
  148.     buffer += strlen(buffer);
  149.     len -= strlen(buffer);
  150.   } else
  151.     a->replyTo = 0;
  152.   buffer++;
  153.   len--;
  154.   if (len<1)
  155.     return 0;
  156.   if (get_byte(buffer)) {
  157.     a->sentTo = strdup(buffer);
  158.     buffer += strlen(buffer);
  159.     len -= strlen(buffer);
  160.   } else
  161.     a->sentTo = 0;
  162.   buffer++;
  163.   len--;
  164.   if (len<1)
  165.     return 0;
  166.   if (get_byte(buffer)) {
  167.     a->body = strdup(buffer);
  168.     buffer += strlen(buffer);
  169.     len -= strlen(buffer);
  170.   } else
  171.     a->body = 0;
  172.   buffer++;
  173.   len--;
  174.   
  175.   return (buffer-start);
  176. }
  177.  
  178. int pack_Mail(struct Mail * a, unsigned char * buffer, int len)
  179. {
  180.   unsigned char * start = buffer;
  181.   int destlen = 6+1+1+1+1+1+1+1+1;
  182.   
  183.   if (a->subject)
  184.     destlen += strlen(a->subject);
  185.   if (a->from)
  186.     destlen += strlen(a->from);
  187.   if (a->to)
  188.     destlen += strlen(a->to);
  189.   if (a->cc)
  190.     destlen += strlen(a->cc);
  191.   if (a->bcc)
  192.     destlen += strlen(a->bcc);
  193.   if (a->replyTo)
  194.     destlen += strlen(a->replyTo);
  195.   if (a->sentTo)
  196.     destlen += strlen(a->sentTo);
  197.   if (a->body)
  198.     destlen += strlen(a->body);
  199.   
  200.   if (!buffer)
  201.     return destlen;
  202.   if (len<destlen)
  203.     return 0;
  204.  
  205.   set_short(buffer, ((a->date.tm_year - 4) << 9) |
  206.                     ((a->date.tm_mon  + 1) << 5) |
  207.                     a->date.tm_mday);
  208.   set_byte(buffer+2, a->date.tm_hour);
  209.   set_byte(buffer+3, a->date.tm_min);
  210.   
  211.   if (!a->dated)
  212.     set_long(buffer, 0);
  213.   
  214.   set_byte(buffer+4, (a->read ? (1 << 7) : 0) |
  215.                      (a->signature ? (1 << 6) : 0) |
  216.                      (a->confirmRead ? (1 << 5) : 0) |
  217.                      (a->confirmDelivery ? (1 << 4) : 0) |
  218.                      ((a->priority & 3) << 2) |
  219.                      (a->addressing & 3)
  220.            );
  221.   set_byte(buffer+5, 0);
  222.   
  223.   buffer += 6;
  224.   
  225.   if (a->subject) {
  226.     strcpy(buffer, a->subject);
  227.     buffer += strlen(buffer);
  228.   } else
  229.     set_byte(buffer, 0);
  230.   buffer++;
  231.   if (a->from) {
  232.     strcpy(buffer, a->from);
  233.     buffer += strlen(buffer);
  234.   } else
  235.     set_byte(buffer, 0);
  236.   buffer++;
  237.   if (a->to) {
  238.     strcpy(buffer, a->to);
  239.     buffer += strlen(buffer);
  240.   } else
  241.     set_byte(buffer, 0);
  242.   buffer++;
  243.   if (a->cc) {
  244.     strcpy(buffer, a->cc);
  245.     buffer += strlen(buffer);
  246.   } else
  247.     set_byte(buffer, 0);
  248.   buffer++;
  249.   if (a->bcc) {
  250.     strcpy(buffer, a->bcc);
  251.     buffer += strlen(buffer);
  252.   } else
  253.     set_byte(buffer, 0);
  254.   buffer++;
  255.   if (a->replyTo) {
  256.     strcpy(buffer, a->replyTo);
  257.     buffer += strlen(buffer);
  258.   } else
  259.     set_byte(buffer, 0);
  260.   buffer++;
  261.   if (a->sentTo) {
  262.     strcpy(buffer, a->sentTo);
  263.     buffer += strlen(buffer);
  264.   } else
  265.     set_byte(buffer, 0);
  266.   buffer++;
  267.   if (a->body) {
  268.     strcpy(buffer, a->body);
  269.     buffer += strlen(buffer);
  270.   } else
  271.     set_byte(buffer, 0);
  272.   buffer++;
  273.   
  274.   return (buffer - start);
  275. }
  276.  
  277.  
  278. int unpack_MailAppInfo(struct MailAppInfo * ai, unsigned char * record, int len)
  279. {
  280.   int i;
  281.   unsigned char * start = record;
  282.   
  283.   i = unpack_CategoryAppInfo(&ai->category, record, len);
  284.   if (!i)
  285.     return i;
  286.   record += i;
  287.   len -= i;
  288.   if (len<11)
  289.     return 0;
  290.   ai->dirty = get_short(record);
  291.   record += 2;
  292.   ai->sortOrder = get_byte(record);
  293.   record += 2;
  294.   ai->unsentMessage = get_long(record);
  295.   record += 4;
  296.   
  297.   /*ai->signature = 0;*/ /*strdup(start + get_short(record));*/
  298.   record += 3;
  299.   
  300.   return (record-start);
  301. }
  302.  
  303. int pack_MailAppInfo(struct MailAppInfo * ai, unsigned char * record, int len)
  304. {
  305.   int i;
  306.   unsigned char * start = record;
  307.  
  308.   i = pack_CategoryAppInfo(&ai->category, record, len);
  309.   if (!record)
  310.     return i+11;
  311.   if (!i)
  312.     return i;
  313.   record += i;
  314.   len -= i;
  315.   if (len<8)
  316.     return 0;
  317.   set_short(record, ai->dirty);
  318.   record += 2;
  319.   set_short(record, 0); /* gapfil */
  320.   set_byte(record, ai->sortOrder);
  321.   record += 2;
  322.   set_long(record, ai->unsentMessage);
  323.   record += 4;
  324.   
  325.   set_short(record, (record-start+2));
  326.   record += 2;
  327.   
  328.   /*if (ai->signature)
  329.     strcpy(record, ai->signature);
  330.   else
  331.     set_byte(record, 0);
  332.   record += strlen(record);*/
  333.   set_byte(record, 0);
  334.   record++;
  335.  
  336.   return (record-start);
  337. }
  338.  
  339. int unpack_MailSyncPref(struct MailSyncPref * a, unsigned char * record, int len) {
  340.   unsigned char * start = record;
  341.   
  342.   a->syncType = get_byte(record);
  343.   record += 1;
  344.   a->getHigh = get_byte(record);
  345.   record += 1;
  346.   a->getContaining = get_byte(record);
  347.   record += 2;
  348.   a->truncate = get_short(record);
  349.   record += 2;
  350.   
  351.   if (get_byte(record)) {
  352.     a->filterTo = strdup(record);
  353.     record += strlen(record);
  354.   } else
  355.     a->filterTo = 0;
  356.   record++;
  357.   if (get_byte(record)) {
  358.     a->filterFrom = strdup(record);
  359.     record += strlen(record);
  360.   } else
  361.     a->filterFrom = 0;
  362.   record++;
  363.   if (get_byte(record)) {
  364.     a->filterSubject = strdup(record);
  365.     record += strlen(record);
  366.   } else
  367.     a->filterSubject = 0;
  368.   record++;  
  369.   
  370.   return (record-start);
  371. }
  372.  
  373. int pack_MailSyncPref(struct MailSyncPref * ai, unsigned char * record, int len)
  374. {
  375.   unsigned char * start = record;
  376.   int destlen = 6+1+1+1;
  377.  
  378.   if (ai->filterTo)
  379.     destlen+=strlen(ai->filterTo);
  380.   if (ai->filterSubject)
  381.     destlen+=strlen(ai->filterSubject);
  382.   if (ai->filterFrom)
  383.     destlen+=strlen(ai->filterFrom);
  384.  
  385.   if (!record)
  386.     return destlen;
  387.   if (len<destlen)
  388.     return 0;
  389.     
  390.   set_byte(record, ai->syncType); record++;
  391.   set_byte(record, ai->getHigh); record++;
  392.   set_byte(record, ai->getContaining); record++;
  393.   set_byte(record, 0); record++; /* gapfil */
  394.   set_short(record, ai->truncate); record+=2;
  395.   
  396.   if(ai->filterTo) {
  397.     strcpy(record, ai->filterTo);
  398.     record+=strlen(ai->filterTo);
  399.   }
  400.   *record++ = 0;
  401.  
  402.   if(ai->filterFrom) {
  403.     strcpy(record, ai->filterFrom);
  404.     record+=strlen(ai->filterFrom);
  405.   }
  406.   *record++ = 0;
  407.  
  408.   if(ai->filterSubject) {
  409.     strcpy(record, ai->filterSubject);
  410.     record+=strlen(ai->filterSubject);
  411.   }
  412.   *record++ = 0;
  413.  
  414.   return (record-start);
  415. }
  416.  
  417. int unpack_MailSignaturePref(struct MailSignaturePref * a, unsigned char * record, int len) {
  418.   unsigned char * start = record;
  419.   
  420.   if (len<1)
  421.     return 0;
  422.   
  423.   a->signature = strdup(record);
  424.   
  425.   record+= strlen(a->signature)+1;
  426.   
  427.   return (record-start);
  428. }
  429.  
  430. int pack_MailSignaturePref(struct MailSignaturePref * ai, unsigned char * record, int len)
  431. {
  432.   unsigned char * start = record;
  433.   int destlen = 1;
  434.   if (ai->signature)
  435.     destlen+=strlen(ai->signature);
  436.  
  437.   if (!record)
  438.     return destlen;
  439.   if (len<destlen)
  440.     return 0;
  441.   if (ai->signature) {
  442.     strcpy(record, ai->signature);
  443.     record+=strlen(ai->signature);
  444.   }
  445.   *record = 0;
  446.   record++;
  447.  
  448.   return (record-start);
  449. }
  450.